#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import MySQLdb
import re
import sys

## Parametrage

# Nombre d'enregistrements maximum retournes par requete

max_results = 1000000

# Nombre d'enregistrements maxi par fichier csv

max_file_size = 1000000

# Nombre de lignes avant flush du fichier

flush_limit = 5000

## Connection a la base de donnees

db = MySQLdb.connect(db = 'maxk69_marketer', host = '127.0.0.1', port = 3308, user = 'maxk69', passwd = 'Oups,IveLostMyPassword!')

## Choix des listes a exporter

#listes = [73, 57, 56, 12, 5, 42, 14, 35, 34, 36, 38, 37, 39, 50, 32, 33,
#          30, 31, 55, 54, 43, 45, 74, 75, 76, 77, 78]

listes = [3, 11, 4, 5, 6, 7, 8, 9, 10, 13]

## Initialisation du compteur de listes

nb_listes = 0

## Parcours de la liste

for i in listes:

    ## Extraction du nom de la liste

    cur = db.cursor()
    cur.execute("SELECT `name` FROM `em_lists` WHERE `listid`='" + str(listes[nb_listes]) + "'")
    name = cur.fetchone()[0]
    cur.close()

    ## Transformation des noms de liste

    name = re.sub(' ', '_', name)
    name = re.sub('\\xa8', '', name)
    name = re.sub('\\xa9', '', name)
    name = re.sub('\\xc3', 'e', name)

    ## Generation des noms de fichier

    basename = str(listes[nb_listes]) + '-' + name

    ## Initialisation des limites

    limite_start = 0
    limite_stop = max_results
    continuite = True

    ## Initialisation des compteurs

    nb_subscribers = 0
    nb_files = 0

    ## Initialisation de la derniere adresse

    last_orange_prefix = ''

    ## Boucle

    while continuite == True:

        ## Extraction des donnees

        cur = db.cursor()
        print('\n---------------------------------------------\n')
        print('Extraction des donnes de ' + name)
        cur.execute("SELECT `emailaddress` FROM `em_list_subscribers` WHERE `listid`=" + str(listes[nb_listes]) + " AND `bounced`=0 ORDER BY `emailaddress` ASC LIMIT " + str(limite_start) + "," + str(limite_stop))

        ## Incrementation des limites

        limite_start = limite_stop
        limite_stop = limite_stop + max_results

        ## Premiere iteration

        round = cur.fetchone()

        ## Initialisation du compteur de limites

        compteur_limites = 0

        ## Boucle de lecture des resultats

        print('Lecture et traitement des resultats')

        while round != None:

            ## Initialisation de l'etat

            state = 'subscriber'

            ## Lecture de l'adresse

            current_email = round[0]

            ## Separation du nom et du domaine

            current_prefix = round[0].split('@')[0]
            current_suffix = round[0].split('@')[1]

            ## Test du domaine, dedoublonnage et ouverture du fichier si besoin

            if current_suffix == 'orange.fr':
                last_orange_prefix = current_prefix

            if current_suffix == 'wanadoo.fr' and current_prefix == last_orange_prefix:
                state = 'doublon'
            else:
                if nb_subscribers == 0:
                    file = open(basename + '_' + str(nb_files) + '.csv', 'w')
                nb_subscribers = nb_subscribers + 1

            ## Ecriture de l'adresse et de l'entete si besoin

            if state != 'doublon':

                ######### email marketer #########
                if (nb_subscribers == 1):
                    file.write('"Email Address","Email Format","Confirmed","Subscribe Date (mm/dd/yyyy)"\n')
                file.write('"' + current_email + '","HTML","Confirmed","09/26/2009"\n')
                ##################################

                ############ phplist #############
                #if (nb_subscribers == 1):
                #    file.write('email,\n')
                #file.write(current_email + ',\n')
                ##################################

                ############ indiens #############
                #file.write(current_email + '\n')
                ##################################

                ## Incrementation du compteur de limites

                compteur_limites = compteur_limites + 1

            ## Lecture des compteurs de flush

            if nb_subscribers / flush_limit > 0 and nb_subscribers % flush_limit == 0:
                file.flush()

            ## Reinitialisation des compteurs pour renouvellement de fichier

            if nb_subscribers == max_file_size:
                file.close()
                nb_files = nb_files + 1
                nb_subscribers = 0

            ## Iteration

            round = cur.fetchone()

        ## Test de continuite

        if compteur_limites < max_results:
            continuite = False

        ## Fermeture du curseur d'extraction

        cur.close()

    ## Fermeture du fichier

    file.close()

    ## Incrementation du compteur de listes

    nb_listes = nb_listes + 1

## Fin du script

print('\n---------------------------------------------\n')
print('\nFini !!\n\n')

sys.exit(0)
